#pragma once

#include <iostream>// IWYU pragma: keep
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <cstdio>
#include <functional>
#include "Log.hpp"// IWYU pragma: keep
// #include<functional>

using namespace std;

namespace ThreadMoudle
{

    using func_t = function<void(const string &)>; // typedef function<void()> func_t;

    class Thread
    {
        // typedef string (*func_t)(const string &name);
    public:
        Thread(const string &name, func_t func) : _name(name), _func(func)
        {
            
        }
        void Excute()
        {
            _isrunning = true;
            _func(_name);
            _isrunning = false;
            //_result=_func(_name);
        }
        // 静态成员函数主要用于操作类的静态数据成员。
        // 因为静态成员函数不与类的具体对象绑定，它没有this指针，
        // 所以它不能访问非静态的数据成员和非静态的成员函数（除非通过对象来访问）
        static void *ThreadRoutine(void *args)
        {
            //_func();
            Thread *self = static_cast<Thread *>(args); // 获得了当前对象
            self->Excute();
            return nullptr;
        }
        bool Start()
        {
            int n = ::pthread_create(&_tid, nullptr, ThreadRoutine, this); //::强调使用标准库中的方法
            if (n != 0)
                return false;
            return true;
        }
        string Status()
        {
            if (_isrunning)
                return "running";
            return "sleep";
        }
        string Name()
        {
            return _name;
        }
        void Stop()
        {
            if (_isrunning)
            {
                ::pthread_cancel(_tid);
                _isrunning = false;
            }
            
        }
        void Join()
        {
            if (!_isrunning)
            {
                ::pthread_join(_tid, nullptr);
                
                // delete _td;
            }
        }
        ~Thread()
        {
        }

    private:
        string _name;
        pthread_t _tid;
        bool _isrunning;
        func_t _func; // 线程要执行的回调函数
        // string _result;
        // ThreadDate *_td;
    };
}